person = {"name":"郝建成","age":16,"sex":"女"}
# 访问字典
"""print(person)
# print(person[0]) # 字典不支持索引访问
print(person["name"]) # 通过key来访问它的value
person1 = {"name":"郝建成","age":22,"sex":"女","name":"好健康"}
print(person1) # 有重复的key的话，打印是访问最后一组，会把重复key的值给覆盖"""

# 创建字典，key可以是任何不可变的数据类型，但是主要是用字符串
"""a = {0:"100"} # 通过int去创建字典的key，可以创建成功
b = {(1,):"好健康"} # 通过元组来创建key，可以创建成功
print(a)
print(b)"""

# 创建字典，key不能是不可变的数据类型
"""# c = {[1,2,3]:"好健康"} # 用列表来创建key ，会创建失败
# print(c) # TypeError: unhashable type: 'list'
e = {{"name":"沈腾"}:"好健康"} # 用字典来创建key，会失败
print(e) # TypeError: unhashable type: 'dict'"""

# 使用dict创建字典（dict是字典的关键字）
"""bb = dict(name="沈腾",age = 18,sex = "男")
print(bb)"""

# 创建空的字典对象
"""cc = dict()
cc1 = {}
print(cc)
print(cc1)"""

# todo:通过zip创建字典对象
"""k = ["name","age","job"]
v = ["沈腾",22,"喜剧演员"]
d = dict(zip(k,v)) # 通过zip方法把两个列表放在一起，结合dict转成字典对象
print(d)"""

# 通过fromkeys创建为空的字典
"""b1 = dict.fromkeys(["name","age","sex"]) #列表里面所有的内容，当成了字典的键
print(b1) # {'name': None, 'age': None, 'sex': None}"""

# todo：字典的增删改查
# 查找数据
"""dict_obj = {"姓名":"好健康","年龄":23,"地址":"辽宁沈阳"}
print(dict_obj["姓名"]) # 好健康
# 还是那句话，字典不支持索引访问，请根据关键字来访问"""

# 通过get方法找到存在的可以直接返回
"""dict_obj = {"姓名":"好健康","年龄":23,"地址":"辽宁沈阳"}
print(dict_obj.get("年龄","年龄不存在"))
print(dict_obj.get("性别","性别不存在")) # 通过get方法找到不存在的，返回兜底"""

# todo:列出字典的所有键值对，最外面是列表，里面是元组
"""dict_obj = {"姓名":"好健康","年龄":23,"地址":"辽宁沈阳"}
print(dict_obj.items()) # dict_items([('姓名', '好健康'), ('年龄', 23), ('地址', '辽宁沈阳')])
print(list(dict_obj.items())) # [('姓名', '好健康'), ('年龄', 23), ('地址', '辽宁沈阳')]"""

# 列出所有的键，键？   键就是key值
"""dict_obj = {"姓名":"好健康","年龄":23,"地址":"辽宁沈阳"}
print(dict_obj.keys()) #返回所有的key值
# dict_keys(['姓名', '年龄', '地址'])
print(list(dict_obj.keys())) # 返回所有的key值，返回为列表对象
# ['姓名', '年龄', '地址']"""

# 列出所有的value
dict_obj = {"姓名":"好健康","年龄":23,"地址":"辽宁沈阳"}
"""print(dict_obj.values()) # dict_values(['好健康', 23, '辽宁沈阳'])
print(list(dict_obj.values())) # ['好健康', 23, '辽宁沈阳']"""

# len() 检索字典的长度
# print(f"字典的长度为{len(dict_obj)}") # 字典的长度为3

# 方法1：检查key是否存在于字典
"""if "姓名" in dict_obj: # 默认去做判断，比较的就是字典的key
    print("姓名这个key在字典里面")
else:
    print("姓名这个key不在字典里面")"""

# 方法2：检查key是否存在于字典
"""if "姓名" in list(dict_obj.keys()): # .key()表示的是方法
    print("姓名这个key在字典里")
else:
    print("姓名这个key不在字典里")"""

# 检查value是否存在于字典
"""if "好健康" in list(dict_obj.values()): # 需要拿到value才可以做判断
    print("好健康存在于这个字典")
else:
    print("好健康不在这个字典")"""

# todo： 使用update添加数据
"""new_dict = {"姓名":"号建成"} # 只有一对键值
new_dict["age"] = 17 # 直接用不存在的键值对会直接添加成功
print(new_dict)
# 使用update方法来去新增键值对
new_dict.update({"地址":"辽宁沈阳","爱好":"打游戏"}) # update方法里面可以直接写上要添加的键值对（字典形式）
print(new_dict)"""

# 删除数据
# todo:使用pop删除，是根据字典的key来进行删除，会返回删除掉的value值
dict1 = {"姓名":"沈腾","年龄":23,"爱好":"睡觉"}
"""result = dict1.pop("爱好") # result会返回删除的value值
print(dict1) # 原来的字典
print(result) # 删除的值"""

# 使用popitem：随机删除一组key和value（默认删除最后一个）
"""dict1.popitem()
print(dict1)"""

# del 删除，这个是Python的方法，不是dict的方法，删除键值对
"""del dict1["姓名"]
print(dict1)"""

# clear 清空整个字典
"""dict1.clear()
print(dict1) # {}"""

# 修改数据
"""bb1 = {"姓名":"沈腾","年龄":26,"地址":"辽宁沈阳"}
bb1["姓名"] = "马丽" # 用这个方式；如果key存在则是修改，不存在则是新增
print(bb1)"""

# 遍历访问字典
student_info = {"姓名":"张三","年龄":26,"地址":"辽宁沈阳"}
# 第一种方式：直接遍历字典 todo:直接遍历，访问的是它的key值
"""for i in student_info:
    print(i)"""

# 第二种方式：通过字典获取所有key值方法进行遍历
"""for key in student_info.keys():
    print(key)"""

# todo:item() 遍历访问字典的所有key和value
"""print(list(student_info.items()))
for key,value in student_info.items():
    print(key,value)
# [('姓名', '张三'), ('年龄', 26), ('地址', '辽宁沈阳')]
# 姓名 张三
# 年龄 26
# 地址 辽宁沈阳"""

# 第四种方式：遍历访问字典的value值
"""for value in student_info.values():
    print(value)"""

# todo：字典推导式
"""dict2 = {k:v for k,v in dict1.items()}
print(dict2)"""
"""
k:v  最终返回在字典里面的内容
for k,v 循环开始，k和v是循环变量
in 循环哪个内容
.items():把 key 和 value拿出来一起循环
"""

# 案例一：统计字符出现的次数并打印出现最多的字符
"""chars = ['a','c','x','d','p','a','p','a','c']
result = {} # 定义一个空字典来接收结果集
for i in chars:
    if i not in result:
        result[i] = 1 # 如果不在字典里面，就让它的值等于1
    else:
        result[i] += 1 # 如果在字典里面，就让字典里面的值加1
num = 0
for k,v in result.items():
    if num < v:
        num = v
        k1 = k
print(f"出现次数最多的是字符是{k1},出现的次数为{num}")"""

# 案例二：让用户输入姓名,如果姓名已经存在,提示用户,如果姓名不存在,继续输入年龄,并存入列表里
"""dict_user = {}
while True:
    print("输入 q 退出！")
    username = input("请输入您的姓名：")
    if username == "q":
        break
    if username not in dict_user:
        age = input("请输入您的年龄：")
        dict_user[username] = {"年龄":age}
    else:
        print(f"您输入的姓名{username}已经存在！！！")
print(list(dict_user.items()))"""

# todo：字典解包 ：**表示字典解包
"""c = {"name":"zhang","age":2}
# print(**c) # TypeError: 'name' is an invalid keyword argument for print()
print("Name:{name},age:{age}".format(**c)) # 解包必须要和字典里面定义一致才行"""

# todo:字典的总结
"""
1、字典都是{}出现的，里面的内容是key 和 value 成一个键值对，有多个键值对中间用逗号隔开
2、字典里面的key必须是不可变的数据类型，否则新建字典会失败
3、字典里面的key如果出现了重复，那么拿到的就是最新的一组键值对
4、访问字典可以直接通过key来访问
5、字典的一些内置方法：
dict.update()  # 可以更新字典内容
dict.values() # 获取字典里面的所有的value值，返回的是一个列表
dict.keys() # 返回的是字典所有的key值，一个列表包括的
dict.items() # 返回的是字典键值对，里面列表包含元祖，每一个元组就是一个字典的键值对
6、循环访问字典
6.1、for i in dict: # 这种方式直接遍历所有的key值
6.2、 for key,value in dict.items() # 遍历访问里面的key和value值
6.3、 for key in dict.keys() # 遍历访问里面所有的key值
6.4、 for value in dict.values() # 遍历访问里面所有的value值
"""